package inge_soft.gestoriusNuevo.persistence.DAO.abstraction;

import inge_soft.gestoriusNuevo.persistence.DAO.Exceptions.Abstraction.GestoriusException;
import inge_soft.gestoriusNuevo.persistence.DAO.Exceptions.Implementation.UsuarioInexistenteException;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.EstadoInstitucion;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Institucion;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Usuario;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.UsuarioRegistrado;

import java.util.List;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.dao.DataAccessException;

public interface IUsuarioRegistradoDAO {
	//Buscar por nick
	public UsuarioRegistrado findByNick(String nick);
	
	public UsuarioRegistrado findByUsuario(Usuario usuario)
			throws UsuarioInexistenteException;
	
	//Crea usuario registrado nuevo (persiste)
	public void crearUsuario(UsuarioRegistrado usr) throws DataAccessException;
	
	//Modifica usuario registrado (merge)
	public void modificarUsuario(UsuarioRegistrado usr)throws GestoriusException;
	
	//Elimina usuario registrado (ToDo, sin implementar)
	public void eliminarUsuario(UsuarioRegistrado usr)throws GestoriusException;
	
	/*
	 * Verifica si existe el usuario mediante una query con un count * 
	 * En caso de que exista al menos uno, lanza excepcion "Usuario inexistente"
	 * 
	 */
	public boolean existeUsuario(UsuarioRegistrado nick)throws GestoriusException;
	
	/*
	 * Verifica los datos ingresados para login.
	 * Utiliza el metodo existeUsuario(nick) para comprobar el usuario 
	 * Utiliza una query para obtener la contrase�a del usuario si este existe 
	 * Si existe un usuario con ese nick y esa pass, retorna el usuario de la base de datos
	 */
	public UsuarioRegistrado verificarLogin(UsuarioRegistrado usr)throws GestoriusException;
	
	//Lista todos los usuarios
	public List<UsuarioRegistrado> listAllOrderByName()  throws GestoriusException;
	
	// Obtiene las instituciones de un usuario
	public List<Institucion> obtenerInstituciones(String nickUsuario) throws DataAccessException;
		
	// Agrega una institucion a la lista de instituciones de un usuario
	public void crearInstitucion(String nickUsuario,Institucion institucionNueva) throws DataAccessException; 	
	
	//Modifica la institucion de un usuario
	public void modificarInstitucion(String nickUsuario, Institucion institucionModificada) throws DataAccessException;
	
	//Lista los estados posibles que puede tomar una institucion 
	public List<EstadoInstitucion> obtenerEstadosInstitucion();
}
